#!/usr/bin/env zx

import { $, chalk, quiet } from 'zx'
import { errorBoxen, infoBoxen } from './boxen.mjs'
// 输出去前后空白
 const stdoutTrim = processOutput => processOutput.stdout.trim()
// 直接包装整个promise对象
const outputTrim = promisify => promisify?.then(stdoutTrim)

// 当前分支名
const currentBranch = await outputTrim(quiet($`git rev-parse --abbrev-ref HEAD`))

if (currentBranch === 'master') {
  // 获取合并进来的分支名
  const targetBranch = await quiet(
    $`git reflog -1`.then(({ stdout }) => /@\{\d+\}: merge (.*):/.exec(stdout.trim())?.[1])
  )

  // 如果不存合并分支 直接成功推出该脚本
  if (!targetBranch) {
    process.exit(0)
  }

  // 查看 当前分支 中比 目标分支 中多提交了哪些内容
  const commitListStr = await quiet($`git log origin/master..master`)

  // 获取 当前分支多出来的commit次数
  const commitNum = commitListStr.toString().match(/commit /gi)?.length ?? 0

  if (commitNum > 1) {
    errorBoxen(
      `检测到此次合含有${commitNum}条commit差异，请合并成1条，再合入master分支。\n${chalk.gray(
        `merge产生的节点也计算在内，这要求我们严格按照commit规范合入master分支`
      )}\n\n推荐依次使用如下命令:\n1. 和远程的origin/master保持同步 ${chalk.bold(
        chalk.blue(`git pull`)
      )}\n2. 切换到自己的开发分支 ${chalk.bold(
        chalk.blue(`git switch ${targetBranch}`)
      )}\n3. 多条commit合并成1条 ${chalk.bold(chalk.blue(`git rebase -i <hash>`))} 或 ${chalk.bold(chalk.blue(`npm run push message <hash>`))}  或 ${chalk.bold(
        chalk.blue(`git reset <hash>`)
      )}\n${chalk.gray('   使用git reset命令的话 需要再次进行提交')}\n4. 强推自己的开发分支 ${chalk.bold(
        chalk.blue(`git push -f`)
      )}\n5. 变基为远程的master ${chalk.bold(
        chalk.blue(`git pull origin master --rebase`)
      )}\n6. 切换回master分支 ${chalk.bold(chalk.blue(`git switch master`))}\n7. 再次发起合并操作 ${chalk.bold(
        chalk.blue(`git merge ${targetBranch}`)
      )}`
    )

    await $`git fetch origin master && git reset --hard origin/master`
  } else {
    // 查看当前Tag
    const lastTag = await outputTrim(quiet($`git describe --tags \`git rev-list --tags --max-count=1\``))

    // 打印当前最新的Tag
    infoBoxen(
      `检测到当前最新的Tag为：${chalk.bold(chalk.yellow(lastTag))}`)
  }
}
